01 · ReAct:从零搭一个会用工具的 Agent
零、开始之前
前置:会写 Python,调用过一次大模型 API。不需要懂任何 Agent 框架。
ReAct 是另外五种范式的地基 —— 后面的计划、反思、多智能体都是在这个循环外面套东西。
一、先看一个真实问题
问大模型「我这个项目里有多少个 Python 文件」,它只能说无法访问你的文件系统。问「LangGraph 最新版本是多少」,它会给一个训练时见过的版本号,大概率过期,而且不会告诉你这一点。
这暴露了两个硬边界:看不到你的环境,不知道训练之后发生的事,因而做不了任何改变世界的动作。
跨过这两个边界的桥就是「工具」。ReAct 是让模型自己走这座桥的方法。
二、最朴素的办法,以及它为什么不够
你当然可以自己查了贴给模型:
$ find . -name "*.py" | wc -l
47
prompt = "我的项目有 47 个 Python 文件,帮我分析一下规模"
能用,但三个问题一个比一个致命:
- 你得提前知道要查什么 —— 模型分析到一半想看文件大小,你只能重跑命令、重组 prompt
- 多步任务累死人 —— 「找出最大的 Python 文件看看有什么问题」=列文件 → 看大小 → 读内容 → 分析,来回粘贴四次
- 模型看不到失败 ——
find报错了它不知道,得你自己判断、自己改命令
真正的需求是:让模型自己决定查什么、自己看到结果、自己决定下一步。 你只负责在它开口要的时候替它跑一下。这就是 ReAct。
三、ReAct 到底是什么
3.1 一个生活里的类比
你在电话里指挥一个修水管的师傅,他在现场,你看不见:
| 师傅/你说的话 | 对应 |
|---|---|
| 「我先看看总阀在哪」 | Thought 想 |
| (走过去拧开柜门) | Action 做 |
| 「柜子里有三个阀门,都锈了」 | Observation 看到什么 |
| 你:「那你先拍张照给我」 | 下一轮 Thought |
ReAct 把大模型放在「你」的位置,把你的 Python 代码放在「师傅」的位置。 模型负责想和决定,代码负责跑腿和汇报。
名字即 Reasoning + Acting,出自 Yao 等 2022 年的论文(ICLR 2023)。论文的贡献不是发明工具调用,而是发现:让模型把「我为什么这么做」显式写出来再决定做什么,准确率明显更高。
3.2 三个词的循环

图 1-1 ReAct 的「思考 → 行动 → 观察」循环
图片来源:Datawhale Hello-Agents 第四章(CC BY-NC-SA 4.0)
用大白话说这张图:
| 阶段 | 谁在干活 | 干了什么 |
|---|---|---|
| Thought | 大模型 | 「我现在缺什么信息」 |
| Action | 大模型决定,你的代码执行 | 「调 bash,参数是 find . -name '*.py'」 |
| Observation | 你的代码 | 把命令的输出原样告诉模型 |
然后回到 Thought,直到模型说「我知道答案了」。